package com.gitee.wsl.ext.number

import com.gitee.wsl.math.Math.map
import kotlin.jvm.JvmName

/** Linearly normalizes value from a range. Range must not be empty. This is the inverse of [lerp].
 * @param rangeStart Range start normalized to 0
 * @param rangeEnd Range end normalized to 1
 * @param value Value to normalize
 * @return Normalized value. Values outside of the range are not clamped to 0 and 1
 */
@JvmName("normFloat")
fun norm(rangeStart: Float, rangeEnd: Float, value: Float): Float {
    return (value - rangeStart) / (rangeEnd - rangeStart)
}

/**
 * Normalizes a number from another range into a value between 0 and 1.
 * Identical to map(value, low, high, 0, 1).
 * Numbers outside of the range are not clamped to 0 and 1, because
 * out-of-range values are often intentional and useful. (See the example above.)
 *
 * @method norm
 * @param n incoming value to be normalized
 * @param start lower bound of the value's current range
 * @param stop  upper bound of the value's current range
 */
fun Float.norm( start: Float, stop: Float): Float {
    return map(this, start, stop, 0f, 1f)
}